package edu.server.dominio;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import edu.server.repositorio.MaterialProducto;
import edu.server.util.HibernateUtil;

public class D_MaterialProducto {
	
	public D_MaterialProducto()
	{
		
	}
	
	/**
	 * Méotodo que busca en la base de datos todos los materiales de producto cargados
	 * @return una lista de objetos MaterialProducto.
	 */
	@SuppressWarnings("unchecked")
	public List<MaterialProducto> buscarMaterialesProducto()
	{
		List<MaterialProducto> materialesProducto;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		String hql = "From MaterialProducto";
		
		Query query = session.createQuery(hql);
		
		materialesProducto = query.list();
		
		session.close();
		
		return materialesProducto;
	}
	
	/**
	 * Méotodo que busca en la base de datos todos los materiales de producto cargados que pertenezcan a una clase y elemento particular
	 * @return una lista de objetos MaterialProducto.
	 */
	@SuppressWarnings("unchecked")
	public List<MaterialProducto> buscarMaterialesProducto(int codigoClase, int codigoElemento)
	{
		List<MaterialProducto> materialesProducto;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		materialesProducto = session.createQuery("SELECT DISTINCT P.materialProducto FROM Producto P" +
										" WHERE P.elementoProducto.id.codigoClaseProducto = " + codigoClase +
				 						" AND P.elementoProducto.id.codigoElementoProducto = " + codigoElemento).list();
		
		for (MaterialProducto materialProducto : materialesProducto)
			materialProducto.getNombre();
		
		session.close();
		
		return materialesProducto;
	}

	
	/**
	 * Método que busca en la base de datos el material de producto que tiene el código de material pasado como parámetro.
	 * @param codigoMaterial. Es el código del material que se pretende buscar.
	 * @return MaterialProducto. Retorna el material que tiene el código de material pasado como parámetro.
	 */
	public MaterialProducto buscarMaterialProducto(int codigoMaterial)
	{
		MaterialProducto material;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		material = (MaterialProducto) session.createQuery("FROM MaterialProducto WHERE codigoMaterialProducto = " + codigoMaterial).uniqueResult();
		
		session.close();
		
		return material;
	}
	
	
	/**
	 * Método que busca en la base de datos el material de producto que tiene el nombre de material pasado como parámetro.
	 * @param nombreMaterial. Es el nombre del material que se pretende buscar.
	 * @return MaterialProducto. Retorna el material que tiene el nombre de material pasado como parámetro.
	 */
	public MaterialProducto buscarMaterialProducto(String nombreMaterial)
	{
		MaterialProducto material;
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		session.beginTransaction();
		
		material = (MaterialProducto) session.createQuery("FROM MaterialProducto WHERE nombre LIKE '" + nombreMaterial + "'").uniqueResult();
		
		session.close();
		
		return material;
	}
	
	
	/**
	 * Método que registra en la base de datos un material de producto
	 * @param material. Material que se desea guardar en la base de datos.
	 */
	public void registrarMaterialProducto(MaterialProducto material) throws Exception
	{
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		
		try{
			session.beginTransaction();
			
			session.save(material);
			
			session.getTransaction().commit();
		}
		
		catch(Exception e)
		{
			session.getTransaction().rollback();
			throw e;
		}
	}
}
